// 定义一个正则表达式，验证数字
const reg = /^\d+(\.\d+)?$/

// 声明类Circle
class Circle {
  // 私有化属性radius
  #radius = 0

  // 构造函数
  constructor(radius) {
    this.setRadius(radius)
  }

  // 给#radius赋值
  setRadius(v) {
    if (!reg.test(v) || v <= 0) {
      this.#radius = 1
    } else {
      this.#radius = v
    }
  }

  // 获得圆半径
  getRadius() {
    return this.#radius
  }

  // 计算圆面积的方法
  findArea() {
    return +(this.#radius ** 2 * Math.PI).toFixed(2)
  }
}

// 声明类Cylinder
class Cylinder extends Circle {
  // 定义私有化属性高度
  #length = 0

  // 构造函数
  constructor(radius, length) {
    super(radius)
    this.setLength(length)
  }

  // 设置高度方法
  setLength(v) {
    if (!reg.test(v) || v <= 0) {
      this.#length = 1
    } else {
      this.#length = v
    }
  }

  // 获得圆柱体高度方法
  getLength() {
    return this.#length
  }

  // 计算体积的方法
  findVolume() {
    return +(this.#length * this.findArea()).toFixed(2)
  }
}

// 定义人类
class ManKind {
  // 定义性别属性1表示男 0表示女
  #gender = 0
  // 工资 >=0 的数字
  #salary = 0

  // 定义构造函数
  constructor(gender, salary) {
    this.setGender(gender)
    this.setSalary(salary)
  }

  // setter 设置器
  setGender(gender) {
    if (!/^[01]$/.test(gender)) {
      console.log('性别的值只能选则0或1')
      this.#gender = 0
    } else {
      this.#gender = gender
    }
  }
  /**
   * Description
   * @param {any} salary
   * @returns {any}
   */
  setSalary(salary) {
    if (!reg.test(salary)) {
      console.log('薪水必须是大于等于0的数字')
      this.#salary = 0
    } else {
      this.#salary = salary
    }
  }

  // getter 取值器
  getGender() {
    return this.#gender
  }
  getSalary() {
    return this.#salary
  }

  // 输出性别
  manOrWoman() {
    this.getGender() === 0 ? console.log('女') : console.log('男')
  }

  // 判断是否有工作
  employeed() {
    this.getSalary() === 0 ? console.log('no job') : console.log('has job')
  }
}

// 定义Kids类
class Kids extends ManKind {
  // 私有化属性年龄
  #yearsOld = 1

  /**
   * Kids类的构造函数
   * @param {Number} gender 性别 0或1
   * @param {Number} salary 薪水 >=0
   * @param {Number} yearsOld 年龄 >0
   */
  constructor(gender, salary, yearsOld) {
    super(gender, salary)
    this.setYearsOld(yearsOld)
  }

  /**
   * 设置年龄
   * @param {Number} yearsOld 年龄>0
   * @returns {void}
   */
  setYearsOld(yearsOld) {
    if (!reg.test(yearsOld)) {
      this.#yearsOld = 1
    } else {
      this.#yearsOld = yearsOld
    }
  }
  /**
   * 获得年龄
   * @returns {Number}
   */
  getYearsOld() {
    return this.#yearsOld
  }

  // 打印年龄
  printAge() {
    console.log('当前用户的年龄是:' + this.getYearsOld())
  }

  // 输出当前用户的状态(state)信息
  // 有状态的对象是指有属性并赋值的对象，所以状态是对象的属性
  info() {
    console.log('性别:' + (this.getGender() === 0 ? '女' : '男'))
    console.log('年龄:' + this.getYearsOld())
    console.log('薪水:' + this.getSalary())
    console.log('工作:' + (this.getSalary() === 0 ? 'no job' : 'has job'))
  }

  toString() {
    return `{gender: ${this.getGender()}, salary: ${this.getSalary()}, yearsOld: ${this.getYearsOld()}}`
  }
}
